Micron Document
πŸŽ–οΈGitΠ―Ρ€Π°πŸŽ–οΈ


Displaying Rendered β€’ View raw β€’ Download

core/repository/README.md 936be3998f0fe49f58b8a0f9ff2c01e3cbd85609 (936be399) Text, 6.84 KB

T383838:core:repository

Overview

The T383838:core:repository module defines the data and infrastructure contracts for the Meshtastic KMP architecture. It is almost entirely interfaces β€” concrete implementations live in T383838:core:service and platform modules. Consumers receive T383838:core:model and T383838:core:proto transitively because both are T383838api()-exported.

Targets: Android Β· JVM Β· iOS (via T383838meshtastic.kmp.library convention plugin)

Key Responsibilities

β€’ Define the reactive data contracts between the long-running mesh service and all feature/UI layers
β€’ Declare the raw hardware I/O interface (T383838RadioTransport)
β€’ Provide the mesh node database interface (T383838NodeRepository)
β€’ Expose per-node remote-admin passkey management (T383838SessionManager)
β€’ Host all packet handlers (admin, telemetry, traceroute, store-and-forward, neighbour info)
β€’ Manage the outbound message queue, MQTT bridge, and XModem firmware transfer
β€’ Provide the T383838AppWidgetUpdater contract so the mesh service can trigger widget refreshes without depending on Android widget APIs directly

Source Structure

T282828
src/
β”œβ”€β”€ commonMain/kotlin/org/meshtastic/core/repository/
β”‚ β”œβ”€β”€ RadioTransport.kt ← interface: raw hardware I/O
β”‚ β”œβ”€β”€ ServiceRepository.kt ← interface: service ↔ UI bridge
β”‚ β”œβ”€β”€ NodeRepository.kt ← interface: mesh node database
β”‚ β”œβ”€β”€ SessionManager.kt ← interface: per-node passkey store
β”‚ β”œβ”€β”€ MeshConnectionManager.kt ← interface: connection lifecycle callbacks
β”‚ β”œβ”€β”€ AppWidgetUpdater.kt ← interface: trigger widget refresh
β”‚ β”œβ”€β”€ LocationRepository.kt
β”‚ β”œβ”€β”€ LocationService.kt
β”‚ β”œβ”€β”€ CommandSender.kt
β”‚ β”œβ”€β”€ AdminPacketHandler.kt
β”‚ β”œβ”€β”€ FromRadioPacketHandler.kt
β”‚ β”œβ”€β”€ MeshActionHandler.kt
β”‚ β”œβ”€β”€ MeshConfigFlowManager.kt
β”‚ β”œβ”€β”€ MeshConfigHandler.kt
β”‚ β”œβ”€β”€ MeshDataHandler.kt
β”‚ β”œβ”€β”€ MeshLocationManager.kt
β”‚ β”œβ”€β”€ MeshLogRepository.kt
β”‚ β”œβ”€β”€ MeshMessageProcessor.kt
β”‚ β”œβ”€β”€ MeshRouter.kt
β”‚ β”œβ”€β”€ MessageFilter.kt
β”‚ β”œβ”€β”€ MessageQueue.kt
β”‚ β”œβ”€β”€ MqttManager.kt
β”‚ β”œβ”€β”€ NeighborInfoHandler.kt
β”‚ β”œβ”€β”€ NodeManager.kt
β”‚ β”œβ”€β”€ Notification.kt / NotificationManager.kt
β”‚ β”œβ”€β”€ PacketHandler.kt / PacketRepository.kt
β”‚ β”œβ”€β”€ QuickChatActionRepository.kt
β”‚ β”œβ”€β”€ RadioConfigRepository.kt
β”‚ β”œβ”€β”€ RadioInterfaceService.kt
β”‚ β”œβ”€β”€ RadioTransportCallback.kt / RadioTransportFactory.kt
β”‚ β”œβ”€β”€ ServiceBroadcasts.kt
β”‚ β”œβ”€β”€ StoreForwardPacketHandler.kt
β”‚ β”œβ”€β”€ TelemetryPacketHandler.kt
β”‚ β”œβ”€β”€ TracerouteHandler.kt / TracerouteSnapshotRepository.kt
β”‚ β”œβ”€β”€ XModemFile.kt / XModemManager.kt
β”‚ β”œβ”€β”€ usecase/
β”‚ β”‚ └── SendMessageUseCase.kt
β”‚ └── di/
β”‚ └── CoreRepositoryModule.kt
β”œβ”€β”€ androidMain/kotlin/ ← Android LocationRepository actual
β”œβ”€β”€ iosMain/kotlin/ ← iOS LocationRepository actual
└── jvmMain/kotlin/ ← Desktop LocationRepository actual

Core Interfaces

T383838RadioTransport

Raw hardware I/O contract for all physical transports (BLE, USB, TCP, Mock).

T282828
Tff7b72interface T56d364RadioTransport Tb4b4b4{
Tff7b72fun Td2a8ffhandleSendToRadioTb4b4b4(Te6edf3pTb4b4b4: Te6edf3ByteArrayTb4b4b4)
Tff7b72fun Td2a8ffstartTb4b4b4(Tb4b4b4)
Tff7b72fun Td2a8ffkeepAliveTb4b4b4(Tb4b4b4)
Tff7b72suspend Tff7b72fun Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tb4b4b4}


T383838ServiceRepository

The primary reactive bridge between the long-running mesh service and all feature/UI layers.

T282828
Tff7b72interface T56d364ServiceRepository Tb4b4b4{
Tff7b72val Te6edf3connectionStateTb4b4b4: Te6edf3StateFlowTff7b72<Te6edf3ConnectionStateTff7b72>
Tff7b72val Te6edf3clientNotificationTb4b4b4: Te6edf3StateFlowTff7b72<Te6edf3ClientNotification?Tff7b72>
Tff7b72val Te6edf3errorMessageTb4b4b4: Te6edf3StateFlowTff7b72<Tffa657String?Tff7b72>
Tff7b72val Te6edf3connectionProgressTb4b4b4: Te6edf3StateFlowTff7b72<Tffa657String?Tff7b72>
Tff7b72val Te6edf3meshPacketFlowTb4b4b4: Te6edf3FlowTff7b72<Te6edf3MeshPacketTff7b72>
Tff7b72val Te6edf3tracerouteResponseTb4b4b4: Te6edf3FlowTff7b72<Tb4b4b4.Tb4b4b4.Tb4b4b4.Tff7b72>
Tff7b72val Te6edf3neighborInfoResponseTb4b4b4: Te6edf3FlowTff7b72<Tb4b4b4.Tb4b4b4.Tb4b4b4.Tff7b72>
Tff7b72val Te6edf3serviceActionTb4b4b4: Te6edf3FlowTff7b72<Te6edf3ServiceActionTff7b72>

Tff7b72fun Td2a8ffsetConnectionStateTb4b4b4(Te6edf3stateTb4b4b4: Te6edf3ConnectionStateTb4b4b4)
Tff7b72fun Td2a8ffemitMeshPacketTb4b4b4(Te6edf3packetTb4b4b4: Te6edf3MeshPacketTb4b4b4)
Tff7b72fun Td2a8ffonServiceActionTb4b4b4(Te6edf3actionTb4b4b4: Te6edf3ServiceActionTb4b4b4)
Tb4b4b4}


T383838NodeRepository

Reactive mesh node database. Backed by Room KMP in T383838:core:service.

T282828
Tff7b72interface T56d364NodeRepository Tb4b4b4{
Tff7b72val Te6edf3myNodeInfoTb4b4b4: Te6edf3StateFlowTff7b72<Te6edf3MyNodeInfo?Tff7b72>
Tff7b72val Te6edf3ourNodeInfoTb4b4b4: Te6edf3StateFlowTff7b72<Te6edf3Node?Tff7b72>
Tff7b72val Te6edf3myIdTb4b4b4: Te6edf3StateFlowTff7b72<Tffa657String?Tff7b72>
Tff7b72val Te6edf3localStatsTb4b4b4: Te6edf3StateFlowTff7b72<Te6edf3LocalStatsTff7b72>
Tff7b72val Te6edf3nodeDBbyNumTb4b4b4: Te6edf3StateFlowTff7b72<Te6edf3MapTff7b72<Tffa657IntTb4b4b4, Te6edf3NodeTff7b72>Tff7b72>
Tff7b72val Te6edf3onlineNodeCountTb4b4b4: Te6edf3FlowTff7b72<Tffa657IntTff7b72>
Tff7b72val Te6edf3totalNodeCountTb4b4b4: Te6edf3FlowTff7b72<Tffa657IntTff7b72>

Tff7b72fun Td2a8ffgetNodesTb4b4b4(Te6edf3sortTb4b4b4, Te6edf3filterTb4b4b4, Te6edf3includeUnknownTb4b4b4, Te6edf3onlyOnlineTb4b4b4, Te6edf3onlyDirectTb4b4b4)Tb4b4b4: Te6edf3FlowTff7b72<Te6edf3ListTff7b72<Te6edf3NodeTff7b72>Tff7b72>
Tff7b72suspend Tff7b72fun Td2a8ffupsertTb4b4b4(Te6edf3nodeTb4b4b4: Te6edf3NodeTb4b4b4)
Tff7b72suspend Tff7b72fun Td2a8ffclearNodeDBTb4b4b4(Te6edf3preserveFavoritesTb4b4b4: Tffa657Boolean Tff7b72= Tff7b72falseTb4b4b4)
Tff7b72suspend Tff7b72fun Td2a8ffdeleteNodeTb4b4b4(Te6edf3numTb4b4b4: Tffa657IntTb4b4b4)
Tff7b72suspend Tff7b72fun Td2a8ffinsertMetadataTb4b4b4(Te6edf3nodeNumTb4b4b4: Tffa657IntTb4b4b4, Te6edf3metadataTb4b4b4: Te6edf3DeviceMetadataTb4b4b4)
Tff7b72suspend Tff7b72fun Td2a8ffinstallConfigTb4b4b4(Te6edf3miTb4b4b4: Te6edf3MyNodeInfoTb4b4b4, Te6edf3nodesTb4b4b4: Te6edf3ListTff7b72<Te6edf3NodeInfoTff7b72>Tb4b4b4)
Tb4b4b4}


T383838SessionManager

Per-node remote-admin passkey store, consumed by T383838:core:domain's T383838EnsureRemoteAdminSessionUseCase.

T282828
Tff7b72interface T56d364SessionManager Tb4b4b4{
Tff7b72fun Td2a8ffrecordSessionTb4b4b4(Te6edf3srcNodeNumTb4b4b4: Tffa657IntTb4b4b4, Te6edf3passkeyTb4b4b4: Te6edf3ByteStringTb4b4b4)
Tff7b72fun Td2a8ffgetPasskeyTb4b4b4(Te6edf3destNumTb4b4b4: Tffa657IntTb4b4b4)Tb4b4b4: Te6edf3ByteString
Tff7b72fun Td2a8ffclearAllTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3sessionRefreshFlowTb4b4b4: Te6edf3FlowTff7b72<Tffa657IntTff7b72>
Tff7b72fun Td2a8ffobserveSessionStatusTb4b4b4(Te6edf3destNumTb4b4b4: Tffa657IntTb4b4b4)Tb4b4b4: Te6edf3FlowTff7b72<Te6edf3SessionStatusTff7b72>
Tb4b4b4}


Dependency Graph

T282828
core:repository
β”œβ”€β”€ api β†’ core:model (exported to consumers)
β”œβ”€β”€ api β†’ core:proto (exported to consumers)
β”œβ”€β”€ core:common
β”œβ”€β”€ core:database
└── kotlinx.coroutines, kermit, androidx.paging.common

Dependency Graph

<!--region graph-->
T282828
Te6edf3graph Te6edf3TB
:Te6edf3coreTb4b4b4:Te6edf3repositoryTff7b72[Te6edf3repositoryTff7b72]Tff7b72:::Te6edf3kmpTff7b72-Te6edf3library
:Te6edf3coreTb4b4b4:Te6edf3repository T8b949e--> :core:model
:Te6edf3coreTb4b4b4:Te6edf3repository Tff7b72-Tb4b4b4.Tff7b72-Tff7b72> :Te6edf3coreTb4b4b4:Te6edf3common
:Te6edf3coreTb4b4b4:Te6edf3repository Tff7b72-Tb4b4b4.Tff7b72-Tff7b72> :Te6edf3coreTb4b4b4:Tff7b72database
:Te6edf3coreTb4b4b4:Te6edf3repository Tff7b72-Tb4b4b4.Tff7b72-Tff7b72> :Te6edf3coreTb4b4b4:Te6edf3testing

Te6edf3classDef Te6edf3androidTff7b72-Te6edf3application Te6edf3fillTb4b4b4:Te6edf3#CAFFBFTb4b4b4,Te6edf3strokeTb4b4b4:Te6edf3#000Tb4b4b4,Te6edf3strokeTff7b72-Te6edf3widthTb4b4b4:T79c0ff2Te6edf3pxTb4b4b4,Te6edf3colorTb4b4b4:Te6edf3#000Tb4b4b4;
Te6edf3classDef Te6edf3androidTff7b72-Te6edf3applicationTff7b72-Te6edf3compose Te6edf3fillTb4b4b4:Te6edf3#CAFFBFTb4b4b4,Te6edf3strokeTb4b4b4:Te6edf3#000Tb4b4b4,Te6edf3strokeTff7b72-Te6edf3widthTb4b4b4:T79c0ff2Te6edf3pxTb4b4b4,Te6edf3colorTb4b4b4:Te6edf3#000Tb4b4b4;
Te6edf3classDef Te6edf3composeTff7b72-Te6edf3desktopTff7b72-Te6edf3application Te6edf3fillTb4b4b4:Te6edf3#CAFFBFTb4b4b4,Te6edf3strokeTb4b4b4:Te6edf3#000Tb4b4b4,Te6edf3strokeTff7b72-Te6edf3widthTb4b4b4:T79c0ff2Te6edf3pxTb4b4b4,Te6edf3colorTb4b4b4:Te6edf3#000Tb4b4b4;
Te6edf3classDef Te6edf3androidTff7b72-Te6edf3feature Te6edf3fillTb4b4b4:Te6edf3#FFD6A5Tb4b4b4,Te6edf3strokeTb4b4b4:Te6edf3#000Tb4b4b4,Te6edf3strokeTff7b72-Te6edf3widthTb4b4b4:T79c0ff2Te6edf3pxTb4b4b4,Te6edf3colorTb4b4b4:Te6edf3#000Tb4b4b4;
Te6edf3classDef Te6edf3androidTff7b72-Te6edf3library Te6edf3fillTb4b4b4:Te6edf3#9BF6FFTb4b4b4,Te6edf3strokeTb4b4b4:Te6edf3#000Tb4b4b4,Te6edf3strokeTff7b72-Te6edf3widthTb4b4b4:T79c0ff2Te6edf3pxTb4b4b4,Te6edf3colorTb4b4b4:Te6edf3#000Tb4b4b4;
Te6edf3classDef Te6edf3androidTff7b72-Te6edf3libraryTff7b72-Te6edf3compose Te6edf3fillTb4b4b4:Te6edf3#9BF6FFTb4b4b4,Te6edf3strokeTb4b4b4:Te6edf3#000Tb4b4b4,Te6edf3strokeTff7b72-Te6edf3widthTb4b4b4:T79c0ff2Te6edf3pxTb4b4b4,Te6edf3colorTb4b4b4:Te6edf3#000Tb4b4b4;
Te6edf3classDef Te6edf3androidTff7b72-Te6edf3test Te6edf3fillTb4b4b4:Te6edf3#A0C4FFTb4b4b4,Te6edf3strokeTb4b4b4:Te6edf3#000Tb4b4b4,Te6edf3strokeTff7b72-Te6edf3widthTb4b4b4:T79c0ff2Te6edf3pxTb4b4b4,Te6edf3colorTb4b4b4:Te6edf3#000Tb4b4b4;
Te6edf3classDef Te6edf3jvmTff7b72-Te6edf3library Te6edf3fillTb4b4b4:Te6edf3#BDB2FFTb4b4b4,Te6edf3strokeTb4b4b4:Te6edf3#000Tb4b4b4,Te6edf3strokeTff7b72-Te6edf3widthTb4b4b4:T79c0ff2Te6edf3pxTb4b4b4,Te6edf3colorTb4b4b4:Te6edf3#000Tb4b4b4;
Te6edf3classDef Te6edf3kmpTff7b72-Te6edf3feature Te6edf3fillTb4b4b4:Te6edf3#FFD6A5Tb4b4b4,Te6edf3strokeTb4b4b4:Te6edf3#000Tb4b4b4,Te6edf3strokeTff7b72-Te6edf3widthTb4b4b4:T79c0ff2Te6edf3pxTb4b4b4,Te6edf3colorTb4b4b4:Te6edf3#000Tb4b4b4;
Te6edf3classDef Te6edf3kmpTff7b72-Te6edf3libraryTff7b72-Te6edf3compose Te6edf3fillTb4b4b4:Te6edf3#FFC1CCTb4b4b4,Te6edf3strokeTb4b4b4:Te6edf3#000Tb4b4b4,Te6edf3strokeTff7b72-Te6edf3widthTb4b4b4:T79c0ff2Te6edf3pxTb4b4b4,Te6edf3colorTb4b4b4:Te6edf3#000Tb4b4b4;
Te6edf3classDef Te6edf3kmpTff7b72-Te6edf3library Te6edf3fillTb4b4b4:Te6edf3#FFC1CCTb4b4b4,Te6edf3strokeTb4b4b4:Te6edf3#000Tb4b4b4,Te6edf3strokeTff7b72-Te6edf3widthTb4b4b4:T79c0ff2Te6edf3pxTb4b4b4,Te6edf3colorTb4b4b4:Te6edf3#000Tb4b4b4;
Te6edf3classDef Tff7b72unknown Te6edf3fillTb4b4b4:Te6edf3#FFADADTb4b4b4,Te6edf3strokeTb4b4b4:Te6edf3#000Tb4b4b4,Te6edf3strokeTff7b72-Te6edf3widthTb4b4b4:T79c0ff2Te6edf3pxTb4b4b4,Te6edf3colorTb4b4b4:Te6edf3#000Tb4b4b4;


<!--endregion-->

Served by rngit 1.5.0 - Generated in 0.08s